// permission 文件 使用了处理登录拦截 router.beforeEach() 和router.afterEach()
import router from '@/router'

import store from '@/store'

// 使用一个进度条插件 Nprogress 1.下包 2.导包+样式 3.使用
import Nprogress from 'nprogress'
import '../node_modules/nprogress/nprogress.css'

// 获取token

// 在全局前置守卫里面判断是否有 token ，有token 判断是否去登录页，是  引导到首页，否 直接放行
//    /                                无token 判断访问的是否是百名单，如果是，直接放行，不是，拦截到登录页

// 白名单
const whiteList = ['/login', '/404']
router.beforeEach(async(to, from, next) => {
  // 这个获取token 不能放在外面，要不然跳转不不
  console.log('我是全局前置路由守卫的to', to)
  Nprogress.start()
  const token = store.getters.token

  if (token) {
    // 有token
    if (to.path === '/login') {
      // 说明登录成功了，不需要重新登录，渲染了
      next('/')
      Nprogress.done()
    } else {
      // 放行的时候，如果只有token 不知道权限，也不行
      if (!store.state.user.userInfo.userId) {
        // 从仓库没有找到userId 就发请求，那用户个人信息
        const { roles } = await store.dispatch('user/getUserInfo')
        // console.log('将来权限控制', roles)
        // 拿到权限之后，应根据权限信息，从动态路由模块中筛选出需要追加的路由-想要用模块里面的action需要dispatch并且带模块
        const otherRoutes = await store.dispatch('permission/filterRoutes', roles.menus)

        router.addRoutes([...otherRoutes, { path: '*', redirect: '/404', hidden: true }])
        console.log('otherRoutes', otherRoutes)
        // 如果有id 并且有权限，可以放行
        next({
          ...to, // next({...to}) 的目的，是保证路由添加完成了再进入页面（可以理解为重新进一次）
          replace: true // 重新进一次，不保留重复历史
        })
        return
      }
      next()
    }
  } else {
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next('/login')
      Nprogress.done()
    }
  }
})

// 关闭进度条
router.afterEach((to, from) => {
  Nprogress.done()
})
